import React, { useState } from 'react';
import { Button, message } from 'antd';
import { CloudDownloadOutlined } from '@ant-design/icons';
import { utils, writeFile } from 'xlsx';
import { getLength, uniqBy } from 'libs';
import dayjs from 'dayjs';

// 使用时安装以下依赖包
// yarn add xlsx

// 参数说明
// data: 数据数组，和 fetchRecordsFun必须存在一个
// columns: 列头参数(支持直接使用Table的columns参数)，可选；支持xlsFunc获取数据
// titles: 自定义列头，可选；  格式：{title:自定义列名, dataIndex：数据中对应的数据项}
// fileName: 下载的文件名称，可选；默认文件名称为日期，格式：2022-10-10fileName.xlsx
// fetchRecordsFun：动态加载数据，可选；返回值必须为data数组
// text: 下载按钮文字，可选；

// 使用案例
//  <DownloadButton columns={columns}
//                  data={store.records}
//                  titles={[{title: '超管', dataIndex: 'is_super'}]}
//  />

export default function DownloadButton(props) {
  const { columns, titles, fileName, fetchRecordsFunc } = props
  const [loading, setLoading] = useState(false);

  async function handleExport() {
    let excelData = [];
    let excelTitle = [];

    setLoading(true)
    const records = fetchRecordsFunc ? await fetchRecordsFunc() : props.data;

    if (columns?.length && titles?.length) {
      excelTitle = uniqBy([...titles, ...columns], 'dataIndex')
    } else if (titles?.length) {
      excelTitle = titles
    } else if (columns?.length) {
      excelTitle = columns
    }

    if (excelTitle.length) {
      for (let record of records) {
        let cur = {}
        for (let v of excelTitle) {
          if (v.title && (v.dataIndex || v.xlsFunc)) {
            cur[v.title] = v.xlsFunc ? v.xlsFunc(record) : record[v.dataIndex]
          }
        }
        excelData.push(cur)
      }
    } else {
      excelData = records
    }

    /* generate worksheet and workbook */
    const workbook = utils.book_new();
    const worksheet = utils.json_to_sheet(excelData);
    // 设置行宽
    worksheet["!cols"] = fitToColumn(excelData);
    //冻结第一行和第一列：
    worksheet['!freeze'] = {
      xSplit: "1",  //冻结列
      ySplit: "1",  //冻结行
      topLeftCell: "B2",  //在未冻结区域的左上角显示的单元格，默认为第一个未冻结的单元格
      state: "frozen"
    }
    utils.book_append_sheet(workbook, worksheet, 'Sheet1');

    /* create an XLSX file and try to save to xx.xlsx */
    writeFile(workbook, `${dayjs().format('YYYY-MM-DD')}${fileName || ''}.xlsx`);
    setLoading(false)
    message.success('下载成功')
  }

  // 获取对象数组中每一项数据最长一项的长度
  function fitToColumn(data) {
    const columnWidths = [];
    for (const property in data[0]) {
      columnWidths.push({ wch: 2 + Math.max(property ? getLength(property) : 0, ...data.map(obj => obj[property] ? getLength(obj[property]) : 0)) });
    }
    return columnWidths;
  }


  return (
    <Button
      type={props.buttonType}
      style={props.style}
      icon={<CloudDownloadOutlined />}
      onClick={handleExport}
      loading={loading}
      disabled={loading}>
      {props.text}
    </Button>
  )
}

DownloadButton.defaultProps = {
  buttonType: 'primary',
  text: '导出',
}
